﻿using System;
using System.Collections;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Busconeitor.Test
{
    /// <summary>
    /// Summary description for UnitTest1
    /// </summary>
    [TestClass]
    public class UnitTest1
    {
        static Hashtable hashPalabrasVacias = new Hashtable();

        public UnitTest1()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        private TestContext testContextInstance;

        /// <summary>
        ///Gets or sets the test context which provides
        ///information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TestMethod1()
        {
            //recivir un mensaje con signos de puntacion y deberia devolver un cadena si signos de puntuacion
            //Los signos a tener en cuenta son: .:;,
            //Entrada: TODO: Add test, logic hereos.
            //Salida: TODO add test logic hereos

            var entrada = "TODO: Add test, logic hereos.";
            var salida = "TODO  Add test  logic hereos ";
            string[,] caracteresEstandarizar = { {"."," "} , {":"," "}, {";"," "}, {","," "} };
            Dictionary<string, string> caracteresLimpiar = new Dictionary<string, string>();
            caracteresLimpiar.Add("."," ");
            caracteresLimpiar.Add(":", " ");
            caracteresLimpiar.Add(";", " ");
            caracteresLimpiar.Add(",", " ");

            var resultado1 = LimpiarTextoSignosPuntuacion(entrada, caracteresLimpiar);
            
            Assert.AreEqual(salida, resultado1);
        }

        [TestMethod]
        public void TestEstandarizarTexto()
        {
            var entrada = "tÃ©xt&oacute; d&oecute; entrÃ¡da para la verga de pruebaÃ";
            var salida = "tÃ©xtó d&oecute; entrÃ¡da para la verga de pruebaÃ";
            Dictionary<string, string> caracteresEstandarizar = new Dictionary<string, string>();

            caracteresEstandarizar.Add("Ã¡", "á");
            caracteresEstandarizar.Add("Ã©", "é");
            caracteresEstandarizar.Add("Ã", "í");
            caracteresEstandarizar.Add("&oacute;", "ó");
            caracteresEstandarizar.Add("&oecute;", "é"); 

            var resultado = EstandarizarTexto(entrada, caracteresEstandarizar);

            Assert.AreEqual(salida, resultado);
        }

        private static string EstandarizarTexto(string entrada, Dictionary<string, string> caracteresEstandarizar)
        {
            for (int i = 0; i < caracteresEstandarizar.Count; i++)
            {
                entrada = entrada.Replace(caracteresEstandarizar.Keys.ElementAt(i), caracteresEstandarizar.Values.ElementAt(i));
            }
            return entrada;
        }

        private static string LimpiarTextoSignosPuntuacion(string entrada, Dictionary<string, string> caracteresLimpiar)
        {
            for (int i = 0; i < caracteresLimpiar.Count; i++)
            {
                entrada = entrada.Replace(caracteresLimpiar.Keys.ElementAt(i), caracteresLimpiar.Values.ElementAt(i));
            }
            //entrada = entrada.Trim();
            return entrada;
        }

        [TestMethod]
        public void EliminarPalabrasVacias()
        {
            var entrada = "desde que vivo solo me tengo que cocinar algunas veces a no ser que compre comida ahora";
            var salida = "que vivo solo tengo que cocinar veces no ser que compre comida ";

            var resultado = EliminarPalabrasVacias(entrada);

            Assert.AreEqual(salida, resultado);
        }

        public static string EliminarPalabrasVacias(String texto)
        {
            StringBuilder nuevoTexto = new StringBuilder();
            string[] textIntermedio = texto.ToString().Split(' ');

            RealizarHashPalabrasVacias();

            foreach (var palabra in textIntermedio)
            {
                if (!EsPalabraVacia(palabra))
                {
                    nuevoTexto.Append(palabra + " ");
                }
            }
            return nuevoTexto.ToString();
        }

        public static bool EsPalabraVacia(string palabra)
        {
            bool esPalabraVacia = false;

            //si la palabra tiene longitud igual a uno retorna true
            if (palabra.Length == 1)
            {
                esPalabraVacia = true;
            }
            else
            {
                if (hashPalabrasVacias.ContainsKey(palabra))
                {
                    esPalabraVacia = true;
                }
            }

            return esPalabraVacia;
        }

        public static void RealizarHashPalabrasVacias()
        {
            if (hashPalabrasVacias.Count == 0)
            {
                foreach (string t in palabrasVacias)
                {
                    hashPalabrasVacias.Add(t, "");
                }   
            }
        }

        public static string[] palabrasVacias = {
                                                    "a", "al", "asi", "aun", "aca", "ademas", "ahi", "ahora", "alguien",
                                                    "alguna", "algunas","desde","me"
                                                };

        public static Match ObtenerMatcher(string er, string cadena)
        {
            Regex regex = new Regex(er, RegexOptions.None);

            Match match = regex.Match(cadena);
            return match;
            //Pattern regex = Pattern.compile(er, Pattern.CANON_EQ);
            //Matcher regexMatcher = regex.matcher(cadena);
            //return regexMatcher;
        }

        [TestMethod]
        public void ObtenerMatcherTest()
        {
            string cadena = "123abc456abc";
            string expresion = "abc";

            Match match = ObtenerMatcher(expresion, cadena);
            //if (match.Success)
            //{
            //    System.Console.WriteLine(match.Value +":"+ match.Index);
            //}
            Assert.IsTrue(true);
        }
    }
}
